今天我們要來講 ROS 的文件系統,在 ROS 的檔案夾中,他會長下面這個樣子
你可能會覺得很複雜,接下來便一個一個來講他是幹嘛的。
他是組織統整 ROS 程式碼的地方,像是套件、工具等等的 , Catkin 指的是 ROS 訂製的編譯構建系統,他是根據 CMake 來進行延伸的,編寫規則也跟 CMake 很像 , 它簡化了 CMake 在編譯時的一些過程,下圖便是整個 Catkin 的架構圖 ,總之 Catkin 是用來編譯 ROS 程式的。
而在早期時,是使用 rosbuild 這個編譯器,但隨著 ROS 的發展,發現他有很多 bug , 於是在 Groovy 後面的版本便開始採用 Catkin。
而這個資料夾是透過指令來創建的,熟悉 Linux 的小夥伴應該都想到怎麼新建了吧!
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make
以下是 catkin_make 他的一些可選參數
catkin_make [args]
-h, --help 幫助信息
-C DIRECTORY, --directory DIRECTORY
工作空間的路徑 (默認為 '.')
--source SOURCE src的路徑 (默認為'workspace_base/src')
--build BUILD build的路徑 (默認為'workspace_base/build')
--use-ninja 用ninja取代make
--use-nmake 用nmake取'make
--force-cmake 強制cmake,即使已經cmake過
--no-color 禁止彩色輸出(只對catkin_make和CMake生效)
--pkg PKG [PKG ...] 只對某個PKG進行make
--only-pkg-with-deps ONLY_PKG_WITH_DEPS [ONLY_PKG_WITH_DEPS ...]
將指定的package列入白名單CATKIN_WHITELIST_PACKAGES,
之編譯白名單里的package。該環境變數存在於CMakeCache.txt。
--cmake-args [CMAKE_ARGS [CMAKE_ARGS ...]]
傳給CMake的參數
--make-args [MAKE_ARGS [MAKE_ARGS ...]]
傳給Make的參數
--override-build-tool-check
用來覆蓋由於不同編譯工具產生的錯誤
首先我們要先建立一個 catkin_ws 資料夾,這個名稱可以更動,但是裡面一定要有一個叫做 src 的資料夾,接下來我們切換到資料夾裏頭,catkin_make
這個指令是用來對資料夾進行初始化用的,有用過 ROS 的朋友應該會知道 catkin_make 最主要的功能並非是初始化空間,而是在我們寫完程式碼後,使用 catkin_make 來進行自動構建(編譯),然後生成我們需要用到的目標文件。
這邊要注意的是我們在 catkin_make 時,一定要回到 ~/catkin_ws/
這個目錄底下,我們在其他目錄做這個事情是會失敗的。然後在編譯後,要做 source 來 重整文件,這樣才能把我們剛剛重整完的文件給丟到環境變數裡面去,這樣系統才知道我們生成的 ROS 文件在哪邊,這樣才能跑 www
source ~/catkin_ws/devel/setup.bash
在我們初始化後,可以發現資料夾底下多了 build、devel 這兩個資料夾。加上原本的 src 便有 三個資料夾了。
我們真正在寫程式碼的地方只有 src , 剩下兩個都不用管, catkin_make 會幫我們管理好她們的。
接下來我們在繼續往下看,src 裡面會放各式各樣的開源包,在這邊有句話是很關鍵的 package 是 catkin 編譯的最基本單元,catkin 編譯的對象便是一個又一個 package,然後他在編譯時是以遞迴的方式運行,所以你可以把 packahge 放在一個又一個的資料夾底下,他都會去慢慢編譯
package 是 ROS 程式碼的最基本組織單位,這是什麼意思? 你可以把 ROS 看成是人類,他是由一個又一個的細胞組成,而 package 便是一個細胞,在這邊要注意的是,不要把一個 package 就當成是一隻可執行文件,一個 package 是可以擁有多個可執行文件的 (Node 節點)。
那我們要怎麼去看出他就是一個 package 呢, 首先一個 package 他需要具備 CMakeList.txt、package.xml。
他是用來跟編譯系統說,怎麼編譯我放在 package 裡面的程式碼,要編譯哪一些程式、需要那些依賴、目標等等。
他的基本寫法如下
cmake_minimum_required() #CMake的版本號
project() #專案名稱
find_package() #找到編譯需要的其他 CMake/Catkin package
catkin_python_setup() #catkin新增巨集,打開catkin的Python Module的支持
add_message_files() #catkin新增巨集,添加自定義 Message/Service/Action 文件
add_service_files()
add_action_files()
generate_message() #catkin新增巨集,生成不同語言版本的 msg/srv/action 接口
catkin_package() #catkin新增巨集,生成當前package的cmake配置,供依賴本包的其他軟件包調用
add_library() #生成庫
add_executable() #生成可執行二進製文件
add_dependencies() #定義目標文件依賴於其他目標文件,確保其他目標已被創建
target_link_libraries() #鏈接
catkin_add_gtest() #catkin新增巨集,生成測試
install() #安裝至本機
如過你沒有寫過 Cmake 文件的話,可以去看一下 Cmake 實戰這本書籍。
他是在對 package 的一些自我描述,裡面會包含 套件(專案)名稱、版本號、作者、內容描述、程式碼許可、編譯的一些資訊等等內容。他在最早期的 ROS 版本中,稱作manifest.xml
,你如果看到他,代表著你看到了很古老的 ROS 套件。
或許你可以發現有一些指令可以快速的分析出這個套件需要甚麼依賴程式庫,他便是直接去找 package.xml ,這樣就可以快速的得到內容了。 rospack find
、rosdep
這兩個指令便是如此。
而 package.xml 他因為 xml 的版本關係,他又有兩種版本
首先第一個版本如下
<pacakge> 根文件
<name> 套件名
<version> 版本號
<description> 內容描述
<maintainer> 作者
<license> 程式碼許可證
<buildtool_depend> 編譯構建工具,通常為catkin
<build_depend> 編譯依賴項,與Catkin中的
<run_depend> 運行依賴項
其中1-6為必備標籤,1是根標籤,嵌套了其餘的所有標籤,2-6為包的各種屬性,7-9為
編譯相關信息。
他大概會長這個樣子
<package>
<name> 套件名
<version> 版本號
<description> 內容描述
<maintainer> 作者
<license> 程式碼許可證
<buildtool_depend> 編譯構建工具,通常為catkin
<build_depend> 編譯依賴項,與Catkin中的
<run_depend> 運行依賴項
</package>
第二個版本長這樣
<pacakge> 根文件
<name> 套件名
<version> 版本號
<description> 內容描述
<maintainer> 作者
<license> 程式碼許可證
<buildtool_depend> 編譯構建工具,通常為catkin
<depend> 指定依賴項為編譯、導出、運行需要的依賴
<build_depend> 編譯依賴項
<build_export_depend> 導出依賴項
<exec_depend> 運行依賴項
<test_depend> 測試用例依賴項
<doc_depend> 文檔依賴項
他比第一個版本多了 <depend>、<build_export_depend>、<exec_depend> 、<test_depend>、<doc_depend>
。
目前主流的 ROS 版本中基本都是同時支援這兩種寫法的,所以基本上都是可以的。
在這個資料夾底下,會存放著 .py 、 .sh 檔,也就是放可執行文件的地方。
這個資料夾底下放有 C 的 .h 檔
這個資料夾放有 C++ 的 .cpp 檔,但是有些 python 的 py 檔也會放在這邊
我們剛剛有提到一個 package 底下可以有多個 可執行文件,那該怎麼做呢? 此時需要 lunch 文件,只要我們把這些要一次跑的東西寫在她裡面,就可以了。
在 ROS 中另一個很重要的點便是 自定義通訊格式,他們的位置是放在 msg訊息 、 srv 服務、action 動作底下。
通訊格式的詳細內容將會在明天講~ 以上便是 ROS catkin 工作空間 中所有常見的資料夾介紹 ~
#Arm Arm Platforms